#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <fstream>

#include "jogo.h"

using namespace std;

jogo::jogo()
{
	col_inicio=0;
	lin_inicio=0;
	/*xy=0;*/
	GuardaX=0;
}

jogo::~jogo()
{
}

//---------------GET'S-----------------
int jogo::getdim_coluna()const{
	return dim_coluna;
}

int jogo::getdim_linha()const{
	return dim_linha;
}

int jogo::getnum_pop()const{
	return num_pop;
}

string jogo::get_celula_linha_1(int pos){

	string linha_1=mapa[pos].getlinha_1();
	return linha_1;
} 

string jogo::get_celula_linha_2(int pos){
	string linha_2=mapa[pos].getlinha_2();
	return linha_2;
}

string jogo::get_celula_linha_3(int pos){
	string linha_3=mapa[pos].getlinha_3();
	return linha_3;
}

int jogo::get_celula_cor(int pos){
	int cor=mapa[pos].getcor();
	return cor;
}

int jogo::getlin_inicio()const{
	return lin_inicio;
}

int jogo::getcol_inicio()const{
	return col_inicio;
}

int jogo::GetGuardaX(){
	return GuardaX;
}

//int jogo::getxy(){
//	return xy;
//}
//--------------SET'S-----------------------
void jogo::setdim_coluna(int coluna){
	dim_coluna=coluna;
}

void jogo::setdim_linha(int linha){
	dim_linha=linha;
}

void jogo::setnum_pop(int num){
	num_pop=num;
}

void jogo::setlin_inicio(int linha){
	lin_inicio=linha;
}

void jogo::setcol_inicio(int coluna){
	col_inicio=coluna;
}

void jogo::SetGuardaX(int x){
	GuardaX=x;
}

//-----//

void jogo::abre_ficheiro(string nome){

	ifstream ficheiro(nome);
	string linha;

	cout << "nome do ficheiro: " << nome << endl;
	while (ficheiro.peek() != EOF)
	{
		getline(ficheiro,linha);
		istringstream iss(linha);

		//iss >> dim_x;   //atribuir numero de colunas
		//iss >> dim_y;   //atribuir numero de linhas 
		//iss >> num_pop; // numero de populacoes

	}
	ficheiro.close();
}

void jogo::dados_jogo(){
	cout << "Numero de linhas: " << dim_linha << endl;
	cout << "Numero de colunas: " << dim_coluna << endl;
	cout << "Numero de populacoes: " << num_pop << endl;

}

bool jogo::cria_mapa(){

	//for(int i=0;i<getdim_linha();i++){
	//	for(int j=0;j<getdim_coluna();j++){
	//		Celula nova;
	//		int flag=i+j;

	//		if(flag%2==0)
	//			nova.setcor(2);
	//		else
	//			nova.setcor(10);

	//		mapa.push_back(nova);
	//	}
	//}

	int flgX=0, *flg=&flgX;
	for (int i=0;i<(dim_coluna*dim_linha);i++){
		if(!AddCelula(i, flg)){
			return false;
		}
	}
}

bool jogo::AddCelula(int i, int *flg)
{
	Celula x;

	if(dim_coluna%2==0){
		if(i%dim_coluna==0 && i!=0)
			if(mapa[i-dim_coluna].getcor()==7) // Branco  pares
			{
				x.setcor(8); // Cinzento
				*flg=0;
			}
			else // Cinzento
			{
				x.setcor(7); // Branco 
				*flg=1;
			}	

		else
			if(*flg==0)
				if(i%2==0)
					x.setcor(8); // Cinzento
				else
					x.setcor(7); // Branco 
			else
				if(i%2==0)
					x.setcor(7); // Branco
				else
					x.setcor(8); // Cinzento
	}
	else
	{
		if(i%2==0)
			x.setcor(8); // Cinzento
		else
			x.setcor(7); // Branco
	}


	mapa.push_back(x);
	return true;
}

bool jogo::verifica_mundo(){
	if(mapa.size()!=0)
		return true;
	return false;

}

bool jogo::cria_populacao(Populacao p){

	if(verifica_populacao(p.getnome())==false){
		return false;
	}

	while (true)
	{
		int flag=0;
		int random=rand()%15;

		for(int i=0;i<populacao.size();i++){
			if(populacao[i].getcor()==random){
				flag=1;
				break;
			}
		}

		if(flag!=1 && random!=2 && random!=10){ // se mudar a cor do tabuleiro mudar este if
			p.setcor(random);
			break;
		}
	}
	if(populacao.size()==0){
		p.setjogada(1);
	}
	populacao.push_back(p);
	return true;
}

bool jogo::verifica_populacao(string nome){

	for(int i=0;i<populacao.size();i++){
		if(nome==populacao[i].getnome()){
			return false;
		}
	}
	return true;
}

void jogo::remove_populacao(string nome){
	for(int i=0;i<populacao.size();i++){

		if(populacao[i].getnome()==nome){
			populacao.erase(populacao.begin()+i);
			return;
		}
	}
}

bool jogo::adiciona_castelo(int linha, int coluna, string nome){
	Castelo c;

	for(int i=0;i<populacao.size();i++){
		if(nome==populacao[i].getnome()){
			populacao[i].addcastelo(c);
			if(mapa[linha*getdim_coluna()+coluna].adiciona_castelo(&c,populacao[i].getcor())==false){
				return false;
			}
			return true;
		}
	}
	return false;
}

